/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.utils.constantes;

import org.apache.commons.lang.StringUtils;

/**
 * @author Holmes Kelly
 */
public final class CodeTypeLiensEnvironnementParNature {

    /**
     * Separateur virgule
     */
    private static final String SEPARATOR_VIRGULE = ",";

    /**
     * constructeur par defaut
     */
    private CodeTypeLiensEnvironnementParNature() {
        // Intentional empty constructor
    }

    /**
     * @param <T> Type enum
     * @param arrayEnum tableau enum
     * @return chaine concatene d'elements
     */
    public static <T> String getTypeListeLiens(T[] arrayEnum) {

        String liensAssemble = null;

        if (arrayEnum != null) {

            liensAssemble = StringUtils.join(arrayEnum, SEPARATOR_VIRGULE);

        }

        return liensAssemble;
    }

    /**
     * @param <T> Type enum
     * @param element array elements
     * @return chaine concatene d'elements
     */
    public static <T> String joinTypeListeLiens(T... element) {

        String liensAssemble = null;

        if (element != null) {

            liensAssemble = StringUtils.join(element, SEPARATOR_VIRGULE);
        }

        return liensAssemble;
    }

    /**
     * Enumeration Liens Doublons Environnement
     */
    public enum LiensDoublons {

        /**
         * Est le même client que
         */
        MCLI1,

        /**
         * Est le même client que (miroir)
         */
        MCLI2;

        /**
         * @return liste liens de type famille/foyer
         */
        public static String typeListeLiensDoublon() {

            return getTypeListeLiens(values());
        }

        /**
         * @param lienRole lien role doublons
         * @return enum correspondant
         */
        public static LiensDoublons getDoublons(String lienRole) {

            for (LiensDoublons doublons : LiensDoublons.values()) {

                if (StringUtils.equals(lienRole, doublons.name())) {

                    return doublons;
                }
            }

            return null;
        }

        /**
         * @param lienRole lien role doublons
         * @return role symetrique
         */
        public static String getRoleSymetrique(String lienRole) {

            LiensDoublons liensDoublonsEnv = getDoublons(lienRole);

            LiensDoublons doublonsSym = null;

            if (liensDoublonsEnv != null) {

                switch (liensDoublonsEnv) {
                    case MCLI1:
                        doublonsSym = MCLI2;
                        break;

                    default:
                        break;
                }

            }

            return doublonsSym == null ? null : doublonsSym.name();

        }

    }

    /**
     * Client Appel Particulier Type Lien
     */
    public static final class TypeLiensClientParticulier {

        /**
         * 
         */
        private TypeLiensClientParticulier() {
            super();
        }

        /**
         * Enumeration Liens Famille Environnement
         */
        public enum LiensFamilleFoyer {

            /**
             * Est de la famille de
             */
            FAMDE,

            /**
             * Est de la famille de (miroir)
             */
            DEFAM,

            /**
             * Est le conjoint/concubin de
             */
            CONP1,

            /**
             * Est le conjoint/concubin de (miroir)
             */
            CONP2,

            /**
             * Est fils/fille de
             */
            ENPAR,

            /**
             * Est le père/mère de
             */
            PAREN;

            /**
             * @return liste liens de type famille/foyer
             */
            public static String typeListeLiensFamille() {

                return getTypeListeLiens(values());
            }

        }

        /**
         * Enumeration Liens Entreprise Environnement
         */
        public enum LiensEntreprise {

            /**
             * Est dirigé par,
             */
            ENDIR,

            /**
             * Est dirigeant de,
             */
            DIREN,

            /**
             * Est lie au particulier (miroir)
             */
            SPPM,

            /**
             * Est lie au particulier
             */
            SPPP;

            /**
             * @return liste liens de type entreprise
             */
            public static String typeListeLiensEntreprise() {

                return getTypeListeLiens(values());
            }

        }

        /**
         * Enumeration Liens Autres Environnement
         */
        public enum LiensAutres {

            /**
             * Est en relation avec
             */
            RELA1,

            /**
             * Est representant legal
             */
            RPLE,

            /**
             * Est le syndic de
             */
            SYNDI,

            /**
             * est l'employeur de
             */
            PATRO,

            /**
             * Est en relation avec (miroir)
             */
            RELA2,

            /**
             * Est representant legal (miroir)
             */
            LERP,

            /**
             * Est le syndic de (miroir)
             */
            ASYND,

            /**
             * Est le salarie de
             */
            SALAR;

            /**
             * @return liste liens de type autre
             */
            public static String typeListeLiensAutre() {

                return getTypeListeLiens(values());
            }

        }

    }

    /**
     * Client Appel Professionnelle Type Lien
     */
    public static final class TypeLiensClientProfessionnelle {

        /**
         * 
         */
        private TypeLiensClientProfessionnelle() {
            super();
        }

        /**
         * Enumeration Liens Famille Environnement
         */
        public enum LiensFamilleFoyer {

            /**
             * Est de la famille de
             */
            FAMDE,

            /**
             * Est de la famille de (miroir)
             */
            DEFAM,

            /**
             * Est le conjoint/concubin de
             */
            CONP1,

            /**
             * Est le conjoint/concubin de (miroir)
             */
            CONP2,

            /**
             * Est fils/fille de
             */
            ENPAR,

            /**
             * Est le père/mère de
             */
            PAREN;

            /**
             * @return liste liens de type famille/foyer
             */
            public static String typeListeLiensFamille() {

                return getTypeListeLiens(values());
            }

        }

        /**
         * Enumeration Liens Entreprise Environnement
         */
        public enum LiensEntreprise {

            /**
             * Est lie au particulier (miroir)
             */
            SPPM,

            /**
             * Est lie au particulier
             */
            SPPP;

            /**
             * @return liste liens de type entreprise
             */
            public static String typeListeLiensEntreprise() {

                return getTypeListeLiens(values());
            }

        }

        /**
         * Enumeration Liens Autres Environnement
         */
        public enum LiensAutres {

            /**
             * Est en relation avec
             */
            RELA1,

            /**
             * Est le comptable de
             */
            COMPT,

            /**
             * A comme comptable
             */
            ACOMP,

            /**
             * Est le syndic de
             */
            SYNDI,

            /**
             * Est le syndic de (miroir)
             */
            ASYND,

            /**
             * Est en relation avec (miroir)
             */
            RELA2,

            /**
             * Est representant legal miroir
             */
            LERP,

            /**
             * Est representant legal
             */
            RPLE,

            /**
             * Est responsable Assurance/Finance
             */
            RASSF,

            /**
             * Est responsable Assurance/Finance miroir
             */
            ASSFR;

            /**
             * @return liste liens de type autre
             */
            public static String typeListeLiensAutre() {

                return getTypeListeLiens(values());
            }

        }

    }

    /**
     * Client Appel Moral Type Lien
     */
    public static final class TypeLiensClientMoral {

        /**
         * 
         */
        private TypeLiensClientMoral() {
            super();
        }

        /**
         * Enumeration Liens Autres Environnement
         */
        public enum LiensAutres {

            /**
             * Est en relation avec
             */
            RELA1,

            /**
             * Est le comptable de
             */
            COMPT,

            /**
             * A comme comptable
             */
            ACOMP,

            /**
             * Est le syndic de
             */
            SYNDI,

            /**
             * Est le syndic de (miroir)
             */
            ASYND,

            /**
             * Est en relation avec (miroir)
             */
            RELA2,

            /**
             * Est representant legal miroir
             */
            LERP,

            /**
             * Est representant legal
             */
            RPLE,

            /**
             * Est responsable Assurance/Finance
             */
            RASSF,

            /**
             * Est responsable Assurance/Finance miroir
             */
            ASSFR,

            /**
             * est l'employeur de
             */
            PATRO,

            /**
             * Est le salarie de
             */
            SALAR;

            /**
             * @return liste liens de type autre
             */
            public static String typeListeLiensAutre() {

                return getTypeListeLiens(values());
            }
        }

        /**
         * Enumeration Liens Entreprise Environnement
         */
        public enum LiensEntreprise {

            /**
             * Est dirigé par,
             */
            ENDIR,

            /**
             * Est dirigeant de,
             */
            DIREN,

            /**
             * Est du meme groupe/franchise que (miroir)
             */
            FRANG,

            /**
             * Est du meme groupe/franchise que
             */
            GFRAN;

            /**
             * @return liste liens de type entreprise
             */
            public static String typeListeLiensEntreprise() {

                return getTypeListeLiens(values());
            }

        }

    }

}
